package threads;

import java.util.concurrent.locks.ReentrantLock;

/**Lock锁跟synchronized锁差不多，但比其更先进，Lock中的方法tryLock()方法能检查锁的东西是否是空闲的
 * 其中reentrantLock(可重入的互斥锁)类，reentrantReadWriteLock(可重入的读写锁，允许多个读取，一个写入)
 * */
public class LockExample
{
    //定义一个可重入锁
    private static final ReentrantLock queueLock=new ReentrantLock();
    //定义一个可重入读写锁
    //private static final ReentrantReadWriteLock orderLock=new ReentrantReadWriteLock();
    public static void main(String[] args) throws InterruptedException {
        buyMilkTea();
        /**奶茶店例子：实现读写分离（老板写订单的时候，员工不能看；员工看的时候老板不能写）*/
    }
    public static void buyMilkTea() throws InterruptedException
    {
        //模拟顾客买奶茶状态,模拟的只是线程的并发
        final LockExample lockExample=new LockExample();
        int number=10;
        Thread[] students=new Thread[number];
        for(int i=0;i<number;i++)
        {
            students[i]=new Thread(new Runnable() {
                @Override
                public void run()
                {
                    try{
                        long walkingTime=(long)(Math.random()*1000);
                        Thread.sleep(walkingTime);
                        lockExample.trytoBuyMilkTea();
                    }catch(InterruptedException e)
                    {
                        System.out.println(e.getMessage());
                    }
                }
            });
            students[i].start();
        }
//        for(int i=0;i<number;i++)
//        {
//            students[i].join();
//        }
    }
    public void trytoBuyMilkTea() throws InterruptedException
    {
        //模拟真正的买奶茶状态,
        //利用tryLock()方法预判锁有没有被锁住
        boolean flag=true;
        while(flag)
        {
            if (queueLock.tryLock())
            {
                //tryLock()是Lock自带的方法，用于判断锁是否空闲，空闲，则可以进入
                long thinkTime=(long)(Math.random()*500);//模仿顾客休眠一段时间
                Thread.sleep(thinkTime);
                System.out.println(Thread.currentThread().getName()+"说：来一杯珍珠奶茶，不要珍珠");
                flag=false;//此时可退出while循环
                queueLock.unlock();//ReentrantLock锁用完要释放掉
           }
            else
            {
                System.out.println(Thread.currentThread().getName()+"等一哈嘛");
            }
            if(flag)
            {
                Thread.sleep(1000);
            }
            else
            {
                System.out.println("不排队不给奶茶！！");
            }
        }
    }
}
